package com.fejal.managed.movimento;


import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import javax.faces.event.AjaxBehaviorEvent;
import javax.faces.model.SelectItem;
import javax.servlet.http.HttpSession;

import com.fejal.bean.Curso;
import com.fejal.bean.Disciplina;
import com.fejal.bean.Faculdade;
import com.fejal.bean.Historico;
import com.fejal.bean.TipoCurso;
import com.fejal.bean.Turma;
import com.fejal.bean.TurmaOferta;
import com.fejal.bean.TurmaOfertaDisciplina;
import com.fejal.controle.validador.GeraMensagem;
import com.fejal.controle.validador.ValidadorFactory;
import com.fejal.controle.validador.Validar;
import com.fejal.dao.DAOFactory;
import com.fejal.util.Listas;

@ManagedBean
@SessionScoped
public class ControleFalta implements Serializable{

	private static final long serialVersionUID = -7517459978933604163L;
	private String pesquisaDescricao;
	private String mensagem;

	private List<Faculdade> faculdades;
	private Faculdade faculdade;
	private Faculdade faculdadeSelecione;
	
	private List<Curso> cursos;
	private Curso curso;
	private Curso cursoSelecione;

	private List<Turma> turmas;
	private Turma turma;
	private Turma turmaSelecione;
	
	private List<Disciplina> disciplinas;
	private Disciplina disciplina;
	private Disciplina disciplinaSelecione;
	
	private List<Historico> historicos;
	
	private Historico historico;
	
	private List<SelectItem> valorFaltas;
	
	private String[] meses = {"Jan", "Fev", "Mar", "Abr", "Mai", "Jun", "Jul", "ago", "Set", "Out", "Nov", "Dez"};
	
	private int ano;
	
	private int semestre;
	private TipoCurso tipoCurso;

	public ControleFalta(){
		limpaListas();
	}

	
	public String criar(){
		limpaListas();
		return "cadastro";
	}
	

	private void limpaListas(){
		faculdades = null;
		cursos = null;
		turmas = null;
		disciplinas = null;
		historicos = null;
		
	}
	
	public String gravar(){
		boolean isOK = true;
		
		if (getHistoricos() == null){
			return "cadastro";
		}

		Matricula matricula = new Matricula();
		for (Historico his : getHistoricos()){
			try {
				
				/*
				 * Calcula as Faltas
				 */
				
				matricula.calculaFaltas(his);
				
				Validar validador = ValidadorFactory.getValidador();
				validador.validar(his);
				String[] mensagens = validador.getMensagensValidacao();
				mensagem = GeraMensagem.getMensagem(mensagens);
				if (validador.isOk()){
					DAOFactory.getHistoricoDAO().alterar(his);
				}else{
					isOK = false;
				}
			} catch (Exception e) {
				isOK = false;
				setMensagem("erro: "+e.getMessage());
			}
		}
		matricula = null;
		
		if (isOK){
			setMensagem("Altera&ccedil;&atilde;o com Sucesso");
			FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO,getMensagem(), ""));
		}else
			FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,getMensagem(), ""));

		return "cadastro";
	}



	public String getMensagem() {
		return mensagem;
	}

	public void setMensagem(String mensagem) {
		this.mensagem = mensagem;
	}

	public String getPesquisaDescricao() {
		return pesquisaDescricao;
	}

	public void setPesquisaDescricao(String pesquisaDescricao) {
		this.pesquisaDescricao = pesquisaDescricao;
	}

	public List<Curso> getCursos() {
		return cursos;
	}

	public void setCursos(List<Curso> cursos) {
		this.cursos = cursos;
	}

	public List<Faculdade> getFaculdades() {
		if (faculdades == null){
			faculdades = DAOFactory.getFaculdadeDAO().getSelecionar("","","");
		}
		return faculdades;
	}

	public void setFaculdades(List<Faculdade> faculdades) {
		this.faculdades = faculdades;
	}

	public Faculdade getFaculdade() {
		return faculdade;
	}

	public void setFaculdade(Faculdade faculdade) {
		this.faculdade = faculdade;
	}

	public Curso getCurso() {
		return curso;
	}

	public void setCurso(Curso curso) {
		this.curso = curso;
	}

	public List<Turma> getTurmas() {
		return turmas;
	}

	public void setTurmas(List<Turma> turmas) {
		this.turmas = turmas;
	}

	public Turma getTurma() {
		return turma;
	}

	public void setTurma(Turma turma) {
		this.turma = turma;
	}

	public List<Disciplina> getDisciplinas() {
		return disciplinas;
	}

	public void setDisciplinas(List<Disciplina> disciplinas) {
		this.disciplinas = disciplinas;
	}

	public Disciplina getDisciplina() {
		return disciplina;
	}

	public void setDisciplina(Disciplina disciplina) {
		this.disciplina = disciplina;
	}



	public Curso getCursoSelecione() {
		if (cursoSelecione == null){
			cursoSelecione = new Curso();
		}
		return cursoSelecione;
	}

	public void setCursoSelecione(Curso cursoSelecione) {
		this.cursoSelecione = cursoSelecione;
	}

	public Turma getTurmaSelecione() {
		if (turmaSelecione == null){
			turmaSelecione = new Turma();
		}
		return turmaSelecione;
	}

	public void setTurmaSelecione(Turma turmaSelecione) {
		this.turmaSelecione = turmaSelecione;
	}

	public Disciplina getDisciplinaSelecione() {
		if (disciplinaSelecione == null){
			disciplinaSelecione = new Disciplina();
		}
		return disciplinaSelecione;
	}

	public void setDisciplinaSelecione(Disciplina disciplinaSelecione) {
		this.disciplinaSelecione = disciplinaSelecione;
	}
	
	public void filtraCursos(){
		turmas = null;
		disciplinas = null;
		historicos = null;
		cursos = DAOFactory.getCursoDAO().getSelecionar(faculdade.getCodigoFaculdade());
	}

	public void filtraTurmas(){
		disciplinas = null;
		historicos = null;
		turmas = DAOFactory.getTurmaDAO().getSelecionar(curso.getCodigoCurso());
	}

	public void filtraDisciplinas(){
		disciplinas = new ArrayList<Disciplina>();
		historicos = null;
		for (TurmaOferta turmaOferta : turma.getTurmaOferta()){
			for (TurmaOfertaDisciplina turmaOfertaDisciplina : turmaOferta.getTurmaOfertaDisciplina()){
				disciplinas.add(turmaOfertaDisciplina.getDisciplina());
			}
		}
	}
	
	public String filtraHistoricos(){
		ano = Integer.valueOf(DAOFactory.getParametroDAO().getParametro("ano").getValor());
		semestre = Integer.valueOf(DAOFactory.getParametroDAO().getParametro("semestre").getValor());
		historicos = DAOFactory.getHistoricoDAO().getSelecionar(turma.getCodigoTurma(), disciplina.getCodigoDisciplina(), ano, semestre);
		return "cadastro";
	}
/*
	public void filtraHistoricos(){
		ano = Integer.valueOf(DAOFactory.getParametroDAO().getParametro("ano").getValor());
		semestre = Integer.valueOf(DAOFactory.getParametroDAO().getParametro("semestre").getValor());
		historicos = DAOFactory.getHistoricoDAO().getSelecionar(turma.getCodigoTurma(), disciplina.getCodigoDisciplina(), ano, semestre);
	}
*/
	
	
	public Faculdade getFaculdadeSelecione() {
		if (faculdadeSelecione == null){
			faculdadeSelecione = new Faculdade();
		}
		return faculdadeSelecione;
	}

	public void setFaculdadeSelecione(Faculdade faculdadeSelecione) {
		this.faculdadeSelecione = faculdadeSelecione;
	}

	public List<Historico> getHistoricos() {
		return historicos;
	}

	public void setHistoricos(List<Historico> historicos) {
		this.historicos = historicos;
	}

	
	public Historico getHistorico() {
		if (historico == null){
			historico = new Historico();
		}
		return historico;
	}

	public void setHistorico(Historico historico) {
		this.historico = historico;
	}


	public List<SelectItem> getValorFaltas() {
		if (valorFaltas == null){
			valorFaltas = (new Listas()).getValorFaltas();
		}
		return valorFaltas;
	}

	public void setValorFaltas(List<SelectItem> valorFaltas) {
		this.valorFaltas = valorFaltas;
	}


	public String[] getMeses() {
		return meses;
	}


	public void setMeses(String[] meses) {
		this.meses = meses;
	}


	public int getAno() {
		return ano;
	}


	public void setAno(int ano) {
		this.ano = ano;
	}


	public int getSemestre() {
		return semestre;
	}


	public void setSemestre(int semestre) {
		this.semestre = semestre;
	}

	public TipoCurso getTipoCurso() {
        HttpSession session = null;
        session = ( HttpSession ) FacesContext.getCurrentInstance().getExternalContext().getSession( true );
        tipoCurso = (TipoCurso) session.getAttribute( "tipoCurso" );

		return tipoCurso;
	}
}
